package com.example.ssrbac.entity;

import lombok.Data;
import org.hibernate.annotations.CreationTimestamp;
import org.hibernate.annotations.UpdateTimestamp;

import javax.persistence.*;
import java.time.LocalDateTime;
import java.util.HashSet;
import java.util.Set;

/**
 * 用户实体类
 * 
 * 该实体类用于存储用户的基本信息，包括：
 * 1. 用户ID、用户名、密码、邮箱等基本信息
 * 2. 用户状态（是否启用）
 * 3. 用户角色关联
 * 4. 创建和更新时间
 * 
 * @author Your Name
 * @version 1.0
 */
@Data
@Entity
@Table(name = "users")
public class User {
    /**
     * 用户ID，主键，自增长
     */
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    /**
     * 用户名，唯一且不能为空
     */
    @Column(unique = true, nullable = false)
    private String username;

    /**
     * 密码，不能为空
     */
    @Column(nullable = false)
    private String password;

    /**
     * 邮箱，唯一
     */
    @Column(unique = true)
    private String email;

    /**
     * 用户状态，默认为启用
     */
    @Column(nullable = false)
    private boolean enabled = true;

    /**
     * 用户角色集合
     * 使用多对多关系映射，通过user_roles关联表实现
     * 采用立即加载策略（EAGER）
     */
    @ManyToMany(fetch = FetchType.EAGER)
    @JoinTable(
        name = "user_roles",
        joinColumns = @JoinColumn(name = "user_id"),
        inverseJoinColumns = @JoinColumn(name = "role_id")
    )
    private Set<Role> roles = new HashSet<>();

    /**
     * 创建时间，自动生成
     */
    @CreationTimestamp
    private LocalDateTime createdAt;

    /**
     * 更新时间，自动更新
     */
    @UpdateTimestamp
    private LocalDateTime updatedAt;

    /**
     * 获取用户状态
     * @return 用户是否启用
     */
    public boolean isEnabled() {
        return enabled;
    }

    /**
     * 设置用户状态
     * @param enabled 是否启用
     */
    public void setEnabled(boolean enabled) {
        this.enabled = enabled;
    }
} 